package com.cms.permission.utils

import android.app.Activity
import android.content.Context
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.lang.reflect.InvocationTargetException


/**
 * @author: Mr.You
 * @create: 2023-02-10 10:47
 * @description:
 **/
class PermissionUtils {
    companion object{

        /**
         * TODO 检查是否需要去请求权限，此方法目的：就是检查 是否已经授权了
         *
         * @param context
         * @param permissions
         * @return 返回false代表需要请求权限，  返回true代表不需要请求权限 就可以结束MyPermisisonActivity了
         */
        fun hasPermissionRequest(context: Context,vararg permissions :String):Boolean{
            for (permission in permissions){
                if (!isPermissionRequest(context,permission)){
                    return false
                }
            }
            return true
        }
        /**
         * TODO 判断参数中传递进去的权限是否已经被授权了
         *
         * @param context
         * @param permission
         * @return
         */
         fun isPermissionRequest(context: Context, permission: String): Boolean {
             return try {
                 val selfPermission = ContextCompat.checkSelfPermission(context, permission)
                 selfPermission == PackageManager.PERMISSION_GRANTED
             }catch (e:Exception){
                 false
             }

         }
        // TODO 最后判断下 是否真正的成功
        fun requestPermissionSuccess(vararg gantedResult: Int): Boolean {
            if (gantedResult == null || gantedResult.size <= 0) {
                return false
            }
            for (permissionValue in gantedResult) {
                if (permissionValue != PackageManager.PERMISSION_GRANTED) {
                    return false
                }
            }
            return true
        }

        // TODO 说白了：就是用户被拒绝过一次，然后又弹出这个框，【需要给用户一个解释，为什么要授权，就需要执行此方法判断】
        // 当用户点击了不再提示，这种情况要考虑到才行
        fun shouldShowRequestPermissionRationale(activity: Activity, vararg permissions: String): Boolean {
            for (permission in permissions) {
                if (activity?.let { ActivityCompat.shouldShowRequestPermissionRationale(it, permission) } == true) {
                    return true
                }
            }
            return false
        }

        // TODO 专门去 回调 MainActivity (被@PermissionCancel/PermissionDenied) 的 函数
        fun invokeAnnotion(`object`: Any, annotionClass: Class<*>?) {
            val objectClass: Class<*> = `object`.javaClass // 可能是 MainActivity

            // 遍历所有函数
            val methods = objectClass.declaredMethods
            for (method in methods) {
                method.isAccessible = true // 让虚拟机不要去检测 private

                // 判断是否被 annotionClass 注解过的函数
                val annotationPresent = method.isAnnotationPresent(annotionClass as Class<out Annotation>)
                if (annotationPresent) {
                    // 当前方法 annotionClass 注解过的函数
                    try {
                        method.invoke(`object`)
                    } catch (e: IllegalAccessException) {
                        e.printStackTrace()
                    } catch (e: InvocationTargetException) {
                        e.printStackTrace()
                    }
                }
            }
        }
    }
}